﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using System.Collections;

namespace MenuXNA
{
	class Menu
	{
		private static int MAX = 20; // máximo de Items en el menú
		private List<String> itemsMenu; // lista de los textos de cada Item
		private List<Vector2> posicionItems; // lista de la posición de cada Item
		private List<Double> escala; // es la escala de cada menú
		private Color noSeleccionado;		//Color del Item que no está seleccionado
		private Color seleccionado;			//Color del Item Seleccionado
		private SpriteFont fuente;		// Sprite para la lera
		private Texture2D check;		// imagen que sirve para poner antes del texto, puede ser null

		public int ItemActual { get; set; } //es el Index o id del Item actual seleccionado
		
		// propiedad que muestra el total de items del Menú
		public int totalItems 
		{
			get
			{
				return itemsMenu.Capacity;
			}
		}

		// propiedad que devuelve el tamaño que ocupa el texto
		public Rectangle tamanoItem(int indexItem)
		{
			return new Rectangle((int)posicionItems[indexItem].X,
				(int)posicionItems[indexItem].Y,
				(int)fuente.MeasureString(itemsMenu[indexItem]).X,
				(int)fuente.MeasureString(itemsMenu[indexItem]).Y);
		}

		public Menu(Color noSeleccionadoColor, Color seleccionadoColor, SpriteFont sp, Texture2D textura)
		{
			if (textura != null)
			{
				check = textura;
			}
			fuente = sp;
			itemsMenu = new List<string>();
			posicionItems = new List<Vector2>();
			escala = new List<double>();
			noSeleccionado = noSeleccionadoColor;
			seleccionado = seleccionadoColor;
			ItemActual = 0;
		}

		// función para agregar Items al menú
		public void addItemMenu(String descripcion, Vector2 posicion)
		{
			if (totalItems < MAX)
			{
				itemsMenu.Add(descripcion);
				posicionItems.Add(posicion);
				escala.Add(1.0f);
			}
		}

		public void seleccionarSiguiente()
		{
			if (ItemActual < totalItems - 1)
			{
				ItemActual++;
			}
			else
			{
				ItemActual = 0;
			}
		}

		public void seleccionarAnterior()
		{
			if (ItemActual > 0)
			{
				ItemActual--;
			}
			else
			{
				ItemActual = totalItems - 1;
			}
		}

		public void Update(GameTime gameTime)
		{
			for (int x = 0; x < totalItems; x++)
			{
				if (x == ItemActual)
				{
					if (escala[x] < 2.0f)
					{
						escala[x] += 0.04 + 10.0f * gameTime.ElapsedGameTime.Seconds;
					}
				}
				else if (escala[x] > 1.0f && x != ItemActual)
				{
					escala[x] -= 0.04 + 10.0f * gameTime.ElapsedGameTime.Seconds;
				}
			}
		}
		
		public void Draw(SpriteBatch spriteBatch)
		{
			spriteBatch.Begin();
			for (int x = 0; x < totalItems; x++)
			{
				if (x == ItemActual)
				{
					Vector2 p = posicionItems[x];
					p.X -= (float)(escala[x] / 2);
					p.Y -= (float)(escala[x] / 2);
					if (check != null)
					{
						spriteBatch.Draw(check, new Vector2(p.X - check.Width, p.Y), Color.White);
					}
					spriteBatch.DrawString(fuente, itemsMenu[x], p, seleccionado, 0.0f, new Vector2(0, 0), (float)escala[x], SpriteEffects.None, 0);
				}
				else
				{
					Vector2 p = posicionItems[x];
					p.X -= (float)(escala[x] / 2);
					p.Y -= (float)(escala[x] / 2);
					spriteBatch.DrawString(fuente, itemsMenu[x], p, noSeleccionado, 0.0f, new Vector2(0, 0), (float)escala[x], SpriteEffects.None, 0);
				}
			}
			spriteBatch.End();
		}

	}
}
